home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / aplictns / xscheme2 / part04 < prev    next >
Internet Message Format  |  1990-04-14  |  52KB

  1. Path: xanth!cs.odu.edu!Amiga-Request
  2. From: Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v90i142: XScheme 0.20 - an object-oriented scheme, Part04/07
  5. Message-ID: <12212@xanth.cs.odu.edu>
  6. Date: 14 Apr 90 21:11:35 GMT
  7. Sender: tadguy@cs.odu.edu
  8. Reply-To: rusty@fe2o3.UUCP (Rusty Haddock)
  9. Lines: 2311
  10. Approved: tadguy@cs.odu.edu (Tad Guy)
  11. X-Mail-Submissions-To: Amiga@cs.odu.edu
  12. X-Post-Discussions-To: comp.sys.amiga
  13.  
  14. Submitted-by: rusty@fe2o3.UUCP (Rusty Haddock)
  15. Posting-number: Volume 90, Issue 142
  16. Archive-name: applications/xscheme-0.20/part04
  17.  
  18. #!/bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 4 (of 7)."
  25. # Contents:  Src/xsfun1.c Src/xsfun2.c
  26. # Wrapped by tadguy@xanth on Sat Apr 14 17:07:26 1990
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'Src/xsfun1.c' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'Src/xsfun1.c'\"
  30. else
  31. echo shar: Extracting \"'Src/xsfun1.c'\" \(19708 characters\)
  32. sed "s/^X//" >'Src/xsfun1.c' <<'END_OF_FILE'
  33. X/* xsfun1.c - xscheme built-in functions - part 1 */
  34. X/*    Copyright (c) 1988, by David Michael Betz
  35. X    All Rights Reserved
  36. X    Permission is granted for unrestricted non-commercial use    */
  37. X
  38. X#include "xscheme.h"
  39. X
  40. X/* gensym variables */
  41. Xstatic char gsprefix[STRMAX+1] = { 'G',0 };    /* gensym prefix string */
  42. Xstatic int gsnumber = 1;            /* gensym number */
  43. X
  44. X/* external variables */
  45. Xextern LVAL xlenv,xlval,default_object,true;
  46. Xextern LVAL s_unbound;
  47. X
  48. X/* external routines */
  49. Xextern int eq(),eqv(),equal();
  50. X
  51. X/* forward declarations */
  52. XFORWARD LVAL cxr();
  53. XFORWARD LVAL member();
  54. XFORWARD LVAL assoc();
  55. XFORWARD LVAL nth();
  56. XFORWARD LVAL eqtest();
  57. X
  58. X/* xcons - construct a new list cell */
  59. XLVAL xcons()
  60. X{
  61. X    LVAL carval,cdrval;
  62. X    
  63. X    /* get the two arguments */
  64. X    carval = xlgetarg();
  65. X    cdrval = xlgetarg();
  66. X    xllastarg();
  67. X
  68. X    /* construct a new cons node */
  69. X    return (cons(carval,cdrval));
  70. X}
  71. X
  72. X/* xcar - built-in function 'car' */
  73. XLVAL xcar()
  74. X{
  75. X    LVAL list;
  76. X    list = xlgalist();
  77. X    xllastarg();
  78. X    return (list ? car(list) : NIL);
  79. X}
  80. X
  81. X/* xicar - built-in function '%car' */
  82. XLVAL xicar()
  83. X{
  84. X    LVAL arg;
  85. X    arg = xlgetarg();
  86. X    xllastarg();
  87. X    return (car(arg));
  88. X}
  89. X
  90. X/* xcdr - built-in function 'cdr' */
  91. XLVAL xcdr()
  92. X{
  93. X    LVAL arg;
  94. X    arg = xlgalist();
  95. X    xllastarg();
  96. X    return (arg ? cdr(arg) : NIL);
  97. X}
  98. X
  99. X/* xicdr - built-in function '%cdr' */
  100. XLVAL xicdr()
  101. X{
  102. X    LVAL arg;
  103. X    arg = xlgetarg();
  104. X    xllastarg();
  105. X    return (cdr(arg));
  106. X}
  107. X
  108. X/* cxxr functions */
  109. XLVAL xcaar() { return (cxr("aa")); }
  110. XLVAL xcadr() { return (cxr("da")); }
  111. XLVAL xcdar() { return (cxr("ad")); }
  112. XLVAL xcddr() { return (cxr("dd")); }
  113. X
  114. X/* cxxxr functions */
  115. XLVAL xcaaar() { return (cxr("aaa")); }
  116. XLVAL xcaadr() { return (cxr("daa")); }
  117. XLVAL xcadar() { return (cxr("ada")); }
  118. XLVAL xcaddr() { return (cxr("dda")); }
  119. XLVAL xcdaar() { return (cxr("aad")); }
  120. XLVAL xcdadr() { return (cxr("dad")); }
  121. XLVAL xcddar() { return (cxr("add")); }
  122. XLVAL xcdddr() { return (cxr("ddd")); }
  123. X
  124. X/* cxxxxr functions */
  125. XLVAL xcaaaar() { return (cxr("aaaa")); }
  126. XLVAL xcaaadr() { return (cxr("daaa")); }
  127. XLVAL xcaadar() { return (cxr("adaa")); }
  128. XLVAL xcaaddr() { return (cxr("ddaa")); }
  129. XLVAL xcadaar() { return (cxr("aada")); }
  130. XLVAL xcadadr() { return (cxr("dada")); }
  131. XLVAL xcaddar() { return (cxr("adda")); }
  132. XLVAL xcadddr() { return (cxr("ddda")); }
  133. XLVAL xcdaaar() { return (cxr("aaad")); }
  134. XLVAL xcdaadr() { return (cxr("daad")); }
  135. XLVAL xcdadar() { return (cxr("adad")); }
  136. XLVAL xcdaddr() { return (cxr("ddad")); }
  137. XLVAL xcddaar() { return (cxr("aadd")); }
  138. XLVAL xcddadr() { return (cxr("dadd")); }
  139. XLVAL xcdddar() { return (cxr("addd")); }
  140. XLVAL xcddddr() { return (cxr("dddd")); }
  141. X
  142. X/* cxr - common car/cdr routine */
  143. XLOCAL LVAL cxr(adstr)
  144. X  char *adstr;
  145. X{
  146. X    LVAL list;
  147. X
  148. X    /* get the list */
  149. X    list = xlgalist();
  150. X    xllastarg();
  151. X
  152. X    /* perform the car/cdr operations */
  153. X    while (*adstr && consp(list))
  154. X    list = (*adstr++ == 'a' ? car(list) : cdr(list));
  155. X
  156. X    /* make sure the operation succeeded */
  157. X    if (*adstr && list)
  158. X    xlbadtype(list);
  159. X
  160. X    /* return the result */
  161. X    return (list);
  162. X}
  163. X
  164. X/* xsetcar - built-in function 'set-car!' */
  165. XLVAL xsetcar()
  166. X{
  167. X    LVAL arg,newcar;
  168. X
  169. X    /* get the cons and the new car */
  170. X    arg = xlgacons();
  171. X    newcar = xlgetarg();
  172. X    xllastarg();
  173. X
  174. X    /* replace the car */
  175. X    rplaca(arg,newcar);
  176. X    return (arg);
  177. X}
  178. X
  179. X/* xisetcar - built-in function '%set-car!' */
  180. XLVAL xisetcar()
  181. X{
  182. X    LVAL arg,newcar;
  183. X
  184. X    /* get the cons and the new car */
  185. X    arg = xlgetarg();
  186. X    newcar = xlgetarg();
  187. X    xllastarg();
  188. X
  189. X    /* replace the car */
  190. X    rplaca(arg,newcar);
  191. X    return (arg);
  192. X}
  193. X
  194. X/* xsetcdr - built-in function 'set-cdr!' */
  195. XLVAL xsetcdr()
  196. X{
  197. X    LVAL arg,newcdr;
  198. X
  199. X    /* get the cons and the new cdr */
  200. X    arg = xlgacons();
  201. X    newcdr = xlgetarg();
  202. X    xllastarg();
  203. X
  204. X    /* replace the cdr */
  205. X    rplacd(arg,newcdr);
  206. X    return (arg);
  207. X}
  208. X
  209. X/* xisetcdr - built-in function '%set-cdr!' */
  210. XLVAL xisetcdr()
  211. X{
  212. X    LVAL arg,newcdr;
  213. X
  214. X    /* get the cons and the new cdr */
  215. X    arg = xlgetarg();
  216. X    newcdr = xlgetarg();
  217. X    xllastarg();
  218. X
  219. X    /* replace the cdr */
  220. X    rplacd(arg,newcdr);
  221. X    return (arg);
  222. X}
  223. X
  224. X/* xlist - built-in function 'list' */
  225. XLVAL xlist()
  226. X{
  227. X    LVAL last,next,val;
  228. X
  229. X    /* initialize the list */
  230. X    val = NIL;
  231. X
  232. X    /* add each argument to the list */
  233. X    if (moreargs()) {
  234. X        val = last = cons(nextarg(),NIL);
  235. X        while (moreargs()) {
  236. X        next = nextarg();
  237. X        push(val);
  238. X        next = cons(next,NIL);
  239. X        rplacd(last,next);
  240. X        last = next;
  241. X        val = pop();
  242. X    }
  243. X    }
  244. X
  245. X    /* return the list */
  246. X    return (val);
  247. X}
  248. X
  249. X/* xappend - built-in function 'append' */
  250. XLVAL xappend()
  251. X{
  252. X    LVAL next,this,last,val;
  253. X
  254. X    /* append each argument */
  255. X    for (val = last = NIL; xlargc > 1; )
  256. X
  257. X    /* append each element of this list to the result list */
  258. X    for (next = xlgalist(); consp(next); next = cdr(next)) {
  259. X        push(val);
  260. X        this = cons(car(next),NIL);
  261. X        val = pop();
  262. X        if (last == NIL) val = this;
  263. X        else rplacd(last,this);
  264. X        last = this;
  265. X    }
  266. X
  267. X    /* tack on the last argument */
  268. X    if (moreargs()) {
  269. X    if (last == NIL) val = xlgetarg();
  270. X    else rplacd(last,xlgetarg());
  271. X    }
  272. X
  273. X    /* return the list */
  274. X    return (val);
  275. X}
  276. X
  277. X/* xreverse - built-in function 'reverse' */
  278. XLVAL xreverse()
  279. X{
  280. X    LVAL next,val;
  281. X    
  282. X    /* get the list to reverse */
  283. X    next = xlgalist();
  284. X    xllastarg();
  285. X
  286. X    /* append each element of this list to the result list */
  287. X    for (val = NIL; consp(next); next = cdr(next)) {
  288. X    push(val);
  289. X    val = cons(car(next),top());
  290. X    drop(1);
  291. X    }
  292. X
  293. X    /* return the list */
  294. X    return (val);
  295. X}
  296. X
  297. X/* xlastpair - built-in function 'last-pair' */
  298. XLVAL xlastpair()
  299. X{
  300. X    LVAL list;
  301. X
  302. X    /* get the list */
  303. X    list = xlgalist();
  304. X    xllastarg();
  305. X
  306. X    /* find the last cons */
  307. X    if (consp(list))
  308. X    while (consp(cdr(list)))
  309. X        list = cdr(list);
  310. X
  311. X    /* return the last element */
  312. X    return (list);
  313. X}
  314. X
  315. X/* xlength - built-in function 'length' */
  316. XLVAL xlength()
  317. X{
  318. X    FIXTYPE n;
  319. X    LVAL arg;
  320. X
  321. X    /* get the argument */
  322. X    arg = xlgalist();
  323. X    xllastarg();
  324. X
  325. X    /* find the length */
  326. X    for (n = (FIXTYPE)0; consp(arg); ++n)
  327. X    arg = cdr(arg);
  328. X
  329. X    /* return the length */
  330. X    return (cvfixnum(n));
  331. X}
  332. X
  333. X/* xmember - built-in function 'member' */
  334. XLVAL xmember()
  335. X{
  336. X    return (member(equal));
  337. X}
  338. X
  339. X/* xmemv - built-in function 'memv' */
  340. XLVAL xmemv()
  341. X{
  342. X    return (member(eqv));
  343. X}
  344. X
  345. X/* xmemq - built-in function 'memq' */
  346. XLVAL xmemq()
  347. X{
  348. X    return (member(eq));
  349. X}
  350. X
  351. X/* member - common routine for member/memv/memq */
  352. XLOCAL LVAL member(fcn)
  353. X  int (*fcn)();
  354. X{
  355. X    LVAL x,list,val;
  356. X
  357. X    /* get the expression to look for and the list */
  358. X    x = xlgetarg();
  359. X    list = xlgalist();
  360. X    xllastarg();
  361. X
  362. X    /* look for the expression */
  363. X    for (val = NIL; consp(list); list = cdr(list))
  364. X    if ((*fcn)(x,car(list))) {
  365. X        val = list;
  366. X        break;
  367. X    }
  368. X
  369. X    /* return the result */
  370. X    return (val);
  371. X}
  372. X
  373. X/* xassoc - built-in function 'assoc' */
  374. XLVAL xassoc()
  375. X{
  376. X    return (assoc(equal));
  377. X}
  378. X
  379. X/* xassv - built-in function 'assv' */
  380. XLVAL xassv()
  381. X{
  382. X    return (assoc(eqv));
  383. X}
  384. X
  385. X/* xassq - built-in function 'assq' */
  386. XLVAL xassq()
  387. X{
  388. X    return (assoc(eq));
  389. X}
  390. X
  391. X/* assoc - common routine for assoc/assv/assq */
  392. XLOCAL LVAL assoc(fcn)
  393. X  int (*fcn)();
  394. X{
  395. X    LVAL x,alist,pair,val;
  396. X
  397. X    /* get the expression to look for and the association list */
  398. X    x = xlgetarg();
  399. X    alist = xlgalist();
  400. X    xllastarg();
  401. X
  402. X    /* look for the expression */
  403. X    for (val = NIL; consp(alist); alist = cdr(alist))
  404. X    if ((pair = car(alist)) && consp(pair))
  405. X        if ((*fcn)(x,car(pair),fcn)) {
  406. X        val = pair;
  407. X        break;
  408. X        }
  409. X
  410. X    /* return the result */
  411. X    return (val);
  412. X}
  413. X
  414. X/* xlistref - built-in function 'list-ref' */
  415. XLVAL xlistref()
  416. X{
  417. X    return (nth(TRUE));
  418. X}
  419. X
  420. X/* xlisttail - built-in function 'list-tail' */
  421. XLVAL xlisttail()
  422. X{
  423. X    return (nth(FALSE));
  424. X}
  425. X
  426. X/* nth - internal nth function */
  427. XLOCAL LVAL nth(carflag)
  428. X  int carflag;
  429. X{
  430. X    LVAL list,arg;
  431. X    int n;
  432. X
  433. X    /* get n and the list */
  434. X    list = xlgalist();
  435. X    arg = xlgafixnum();
  436. X    xllastarg();
  437. X
  438. X    /* range check the index */
  439. X    if ((n = (int)getfixnum(arg)) < 0)
  440. X    xlerror("index out of range",arg);
  441. X
  442. X    /* find the nth element */
  443. X    for (; consp(list) && n; n--)
  444. X    list = cdr(list);
  445. X
  446. X    /* make sure the list was long enough */
  447. X    if (n)
  448. X    xlerror("index out of range",arg);
  449. X
  450. X    /* return the list beginning at the nth element */
  451. X    return (carflag && consp(list) ? car(list) : list);
  452. X}
  453. X
  454. X/* xboundp - is this a value bound to this symbol? */
  455. XLVAL xboundp()
  456. X{
  457. X    LVAL sym;
  458. X    sym = xlgasymbol();
  459. X    xllastarg();
  460. X    return (boundp(sym) ? true : NIL);
  461. X}
  462. X
  463. X/* xsymvalue - get the value of a symbol */
  464. XLVAL xsymvalue()
  465. X{
  466. X    LVAL sym;
  467. X    sym = xlgasymbol();
  468. X    xllastarg();
  469. X    return (getvalue(sym));
  470. X}
  471. X
  472. X/* xsetsymvalue - set the value of a symbol */
  473. XLVAL xsetsymvalue()
  474. X{
  475. X    LVAL sym,val;
  476. X
  477. X    /* get the symbol */
  478. X    sym = xlgasymbol();
  479. X    val = xlgetarg();
  480. X    xllastarg();
  481. X
  482. X    /* set the global value */
  483. X    setvalue(sym,val);
  484. X
  485. X    /* return its value */
  486. X    return (val);
  487. X}
  488. X
  489. X/* xsymplist - get the property list of a symbol */
  490. XLVAL xsymplist()
  491. X{
  492. X    LVAL sym;
  493. X
  494. X    /* get the symbol */
  495. X    sym = xlgasymbol();
  496. X    xllastarg();
  497. X
  498. X    /* return the property list */
  499. X    return (getplist(sym));
  500. X}
  501. X
  502. X/* xsetsymplist - set the property list of a symbol */
  503. XLVAL xsetsymplist()
  504. X{
  505. X    LVAL sym,val;
  506. X
  507. X    /* get the symbol */
  508. X    sym = xlgasymbol();
  509. X    val = xlgetarg();
  510. X    xllastarg();
  511. X
  512. X    /* set the property list */
  513. X    setplist(sym,val);
  514. X    return (val);
  515. X}
  516. X
  517. X/* xget - get the value of a property */
  518. XLVAL xget()
  519. X{
  520. X    LVAL sym,prp;
  521. X
  522. X    /* get the symbol and property */
  523. X    sym = xlgasymbol();
  524. X    prp = xlgasymbol();
  525. X    xllastarg();
  526. X
  527. X    /* retrieve the property value */
  528. X    return (xlgetprop(sym,prp));
  529. X}
  530. X
  531. X/* xput - set the value of a property */
  532. XLVAL xput()
  533. X{
  534. X    LVAL sym,val,prp;
  535. X
  536. X    /* get the symbol and property */
  537. X    sym = xlgasymbol();
  538. X    prp = xlgasymbol();
  539. X    val = xlgetarg();
  540. X    xllastarg();
  541. X
  542. X    /* set the property value */
  543. X    xlputprop(sym,val,prp);
  544. X
  545. X    /* return the value */
  546. X    return (val);
  547. X}
  548. X
  549. X/* xtheenvironment - built-in function 'the-environment' */
  550. XLVAL xtheenvironment()
  551. X{
  552. X    xllastarg();
  553. X    return (xlenv);
  554. X}
  555. X
  556. X/* xprocenvironment - built-in function 'procedure-environment' */
  557. XLVAL xprocenvironment()
  558. X{
  559. X    LVAL arg;
  560. X    arg = xlgaclosure();
  561. X    xllastarg();
  562. X    return (getenv(arg));
  563. X}
  564. X
  565. X/* xenvp - built-in function 'environment?' */
  566. XLVAL xenvp()
  567. X{
  568. X    LVAL arg;
  569. X    arg = xlgetarg();
  570. X    xllastarg();
  571. X    return (envp(arg) ? true : NIL);
  572. X}
  573. X
  574. X/* xenvbindings - built-in function 'environment-bindings' */
  575. XLVAL xenvbindings()
  576. X{
  577. X    LVAL env,frame,names,val,this,last;
  578. X    int len,i;
  579. X
  580. X    /* get the environment */
  581. X    env = xlgetarg();
  582. X    xllastarg();
  583. X
  584. X    /* check the argument type */
  585. X    if (closurep(env))
  586. X    env = getenv(env);
  587. X    else if (!envp(env))
  588. X    xlbadtype(env);
  589. X
  590. X    /* initialize */
  591. X    frame = car(env);
  592. X    names = getelement(frame,0);
  593. X    len = getsize(frame);
  594. X    check(1);
  595. X
  596. X    /* build a list of dotted pairs */
  597. X    for (val = last = NIL, i = 1; i < len; ++i, names = cdr(names)) {
  598. X    push(val);
  599. X    this = cons(cons(car(names),getelement(frame,i)),NIL);
  600. X    val = pop();
  601. X    if (last) rplacd(last,this);
  602. X    else val = this;
  603. X    last = this;
  604. X    }
  605. X    return (val);
  606. X}
  607. X
  608. X/* xenvparent - built-in function 'environment-parent' */
  609. XLVAL xenvparent()
  610. X{
  611. X    LVAL env;
  612. X    env = xlgaenv();
  613. X    xllastarg();
  614. X    return (cdr(env));
  615. X}
  616. X
  617. X/* xvector - built-in function 'vector' */
  618. XLVAL xvector()
  619. X{
  620. X    LVAL vect,*p;
  621. X    vect = newvector(xlargc);
  622. X    for (p = &vect->n_vdata[0]; moreargs(); )
  623. X    *p++ = xlgetarg();
  624. X    return (vect);
  625. X}
  626. X
  627. X/* xmakevector - built-in function 'make-vector' */
  628. XLVAL xmakevector()
  629. X{
  630. X    LVAL arg,val,*p;
  631. X    int len;
  632. X    
  633. X    /* get the vector size */
  634. X    arg = xlgafixnum();
  635. X    len = (int)getfixnum(arg);
  636. X
  637. X    /* check for an initialization value */
  638. X    if (moreargs()) {
  639. X    arg = xlgetarg();    /* get the initializer */
  640. X    xllastarg();        /* make sure that's the last argument */
  641. X    cpush(arg);        /* save the initializer */
  642. X    val = newvector(len);    /* create the vector */
  643. X    p = &val->n_vdata[0];    /* initialize the vector */
  644. X    for (arg = pop(); --len >= 0; )
  645. X        *p++ = arg;
  646. X    }
  647. X
  648. X    /* no initialization value */
  649. X    else
  650. X    val = newvector(len);    /* defaults to initializing to NIL */
  651. X    
  652. X    /* return the new vector */
  653. X    return (val);
  654. X}
  655. X
  656. X/* xvlength - built-in function 'vector-length' */
  657. XLVAL xvlength()
  658. X{
  659. X    LVAL arg;
  660. X    arg = xlgavector();
  661. X    xllastarg();
  662. X    return (cvfixnum((FIXTYPE)getsize(arg)));
  663. X}
  664. X
  665. X/* xivlength - built-in function '%vector-length' */
  666. XLVAL xivlength()
  667. X{
  668. X    LVAL arg;
  669. X    arg = xlgetarg();
  670. X    xllastarg();
  671. X    return (cvfixnum((FIXTYPE)getsize(arg)));
  672. X}
  673. X
  674. X/* xvref - built-in function 'vector-ref' */
  675. XLVAL xvref()
  676. X{
  677. X    LVAL vref();
  678. X    return (vref(xlgavector()));
  679. X}
  680. X
  681. X/* xivref - built-in function '%vector-ref' */
  682. XLVAL xivref()
  683. X{
  684. X    LVAL vref();
  685. X    return (vref(xlgetarg()));
  686. X}
  687. X
  688. X/* vref - common code for xvref and xivref */
  689. XLOCAL LVAL vref(vector)
  690. X  LVAL vector;
  691. X{
  692. X    LVAL index;
  693. X    int i;
  694. X
  695. X    /* get the index */
  696. X    index = xlgafixnum();
  697. X    xllastarg();
  698. X
  699. X    /* range check the index */
  700. X    if ((i = (int)getfixnum(index)) < 0 || i >= getsize(vector))
  701. X    xlerror("index out of range",index);
  702. X
  703. X    /* return the vector element */
  704. X    return (getelement(vector,i));
  705. X}
  706. X
  707. X/* xvset - built-in function 'vector-set!' */
  708. XLVAL xvset()
  709. X{
  710. X    LVAL vset();
  711. X    return (vset(xlgavector()));
  712. X}
  713. X
  714. X/* xivset - built-in function '%vector-set!' */
  715. XLVAL xivset()
  716. X{
  717. X    LVAL vset();
  718. X    return (vset(xlgetarg()));
  719. X}
  720. X
  721. X/* vset - common code for xvset and xivset */
  722. XLOCAL LVAL vset(vector)
  723. X  LVAL vector;
  724. X{
  725. X    LVAL index,val;
  726. X    int i;
  727. X
  728. X    /* get the index and the new value */
  729. X    index = xlgafixnum();
  730. X    val = xlgetarg();
  731. X    xllastarg();
  732. X
  733. X    /* range check the index */
  734. X    if ((i = (int)getfixnum(index)) < 0 || i >= getsize(vector))
  735. X    xlerror("index out of range",index);
  736. X
  737. X    /* set the vector element and return the value */
  738. X    setelement(vector,i,val);
  739. X    return (val);
  740. X}
  741. X
  742. X/* xvectlist - built-in function 'vector->list' */
  743. XLVAL xvectlist()
  744. X{
  745. X    LVAL vect;
  746. X    int size;
  747. X
  748. X    /* get the vector */
  749. X    vect = xlgavector();
  750. X    xllastarg();
  751. X    
  752. X    /* make a list from the vector */
  753. X    cpush(vect);
  754. X    size = getsize(vect);
  755. X    for (xlval = NIL; --size >= 0; )
  756. X    xlval = cons(getelement(vect,size),xlval);
  757. X    drop(1);
  758. X    return (xlval);
  759. X}
  760. X
  761. X/* xlistvect - built-in function 'list->vector' */
  762. XLVAL xlistvect()
  763. X{
  764. X    LVAL vect,*p;
  765. X    int size;
  766. X
  767. X    /* get the list */
  768. X    xlval = xlgalist();
  769. X    xllastarg();
  770. X
  771. X    /* make a vector from the list */
  772. X    size = length(xlval);
  773. X    vect = newvector(size);
  774. X    for (p = &vect->n_vdata[0]; --size >= 0; xlval = cdr(xlval))
  775. X    *p++ = car(xlval);
  776. X    return (vect);
  777. X}
  778. X
  779. X/* xmakearray - built-in function 'make-array' */
  780. XLVAL xmakearray()
  781. X{
  782. X    LVAL makearray1(),val;
  783. X    val = makearray1(xlargc,xlsp);
  784. X    drop(xlargc);
  785. X    return (val);
  786. X}
  787. X
  788. XLVAL makearray1(argc,argv)
  789. X  int argc; LVAL *argv;
  790. X{
  791. X    int size,i;
  792. X    LVAL arg;
  793. X
  794. X    /* check for the end of the list of dimensions */
  795. X    if (--argc < 0)
  796. X    return (NIL);
  797. X
  798. X    /* get this dimension */
  799. X    arg = *argv++;
  800. X    if (!fixp(arg))
  801. X    xlbadtype(arg);
  802. X    size = (int)getfixnum(arg);
  803. X
  804. X    /* make the new array */
  805. X    cpush(newvector(size));
  806. X
  807. X    /* fill the array and return it */
  808. X    for (i = 0; i < size; ++i)
  809. X    setelement(top(),i,makearray1(argc,argv));
  810. X    return (pop());
  811. X}
  812. X
  813. X/* xaref - built-in function 'array-ref' */
  814. XLVAL xaref()
  815. X{
  816. X    LVAL array,index;
  817. X    int i;
  818. X
  819. X    /* get the array */
  820. X    array = xlgavector();
  821. X
  822. X    /* get each array index */
  823. X    while (xlargc > 1) {
  824. X    index = xlgafixnum(); i = (int)getfixnum(index);
  825. X    if (i < 0 || i > getsize(array))
  826. X        xlerror("index out of range",index);
  827. X    array = getelement(array,i);
  828. X    if (!vectorp(array))
  829. X        xlbadtype(array);
  830. X    }
  831. X    cpush(array); ++xlargc;
  832. X    return (xvref());
  833. X}
  834. X
  835. X/* xaset - built-in function 'array-set!' */
  836. XLVAL xaset()
  837. X{
  838. X    LVAL array,index;
  839. X    int i;
  840. X
  841. X    /* get the array */
  842. X    array = xlgavector();
  843. X
  844. X    /* get each array index */
  845. X    while (xlargc > 2) {
  846. X    index = xlgafixnum(); i = (int)getfixnum(index);
  847. X    if (i < 0 || i > getsize(array))
  848. X        xlerror("index out of range",index);
  849. X    array = getelement(array,i);
  850. X    if (!vectorp(array))
  851. X        xlbadtype(array);
  852. X    }
  853. X    cpush(array); ++xlargc;
  854. X    return (xvset());
  855. X}
  856. X
  857. X/* xnull - built-in function 'null?' */
  858. XLVAL xnull()
  859. X{
  860. X    LVAL arg;
  861. X    arg = xlgetarg();
  862. X    xllastarg();
  863. X    return (null(arg) ? true : NIL);
  864. X}
  865. X
  866. X/* xatom - built-in function 'atom?' */
  867. XLVAL xatom()
  868. X{
  869. X    LVAL arg;
  870. X    arg = xlgetarg();
  871. X    xllastarg();
  872. X    return (atom(arg) ? true : NIL);
  873. X}
  874. X
  875. X/* xlistp - built-in function 'list?' */
  876. XLVAL xlistp()
  877. X{
  878. X    LVAL arg;
  879. X    arg = xlgetarg();
  880. X    xllastarg();
  881. X    return (listp(arg) ? true : NIL);
  882. X}
  883. X
  884. X/* xnumberp - built-in function 'number?' */
  885. XLVAL xnumberp()
  886. X{
  887. X    LVAL arg;
  888. X    arg = xlgetarg();
  889. X    xllastarg();
  890. X    return (numberp(arg) ? true : NIL);
  891. X}
  892. X
  893. X/* xbooleanp - built-in function 'boolean?' */
  894. XLVAL xbooleanp()
  895. X{
  896. X    LVAL arg;
  897. X    arg = xlgetarg();
  898. X    xllastarg();
  899. X    return (arg == true || arg == NIL ? true : NIL);
  900. X}
  901. X
  902. X/* xpairp - built-in function 'pair?' */
  903. XLVAL xpairp()
  904. X{
  905. X    LVAL arg;
  906. X    arg = xlgetarg();
  907. X    xllastarg();
  908. X    return (consp(arg) ? true : NIL);
  909. X}
  910. X
  911. X/* xsymbolp - built-in function 'symbol?' */
  912. XLVAL xsymbolp()
  913. X{
  914. X    LVAL arg;
  915. X    arg = xlgetarg();
  916. X    xllastarg();
  917. X    return (symbolp(arg) ? true : NIL);
  918. X}
  919. X
  920. X/* xintegerp - built-in function 'integer?' */
  921. XLVAL xintegerp()
  922. X{
  923. X    LVAL arg;
  924. X    arg = xlgetarg();
  925. X    xllastarg();
  926. X    return (fixp(arg) ? true : NIL);
  927. X}
  928. X
  929. X/* xrealp - built-in function 'real?' */
  930. XLVAL xrealp()
  931. X{
  932. X    LVAL arg;
  933. X    arg = xlgetarg();
  934. X    xllastarg();
  935. X    return (floatp(arg) ? true : NIL);
  936. X}
  937. X
  938. X/* xcharp - built-in function 'char?' */
  939. XLVAL xcharp()
  940. X{
  941. X    LVAL arg;
  942. X    arg = xlgetarg();
  943. X    xllastarg();
  944. X    return (charp(arg) ? true : NIL);
  945. X}
  946. X
  947. X/* xstringp - built-in function 'string?' */
  948. XLVAL xstringp()
  949. X{
  950. X    LVAL arg;
  951. X    arg = xlgetarg();
  952. X    xllastarg();
  953. X    return (stringp(arg) ? true : NIL);
  954. X}
  955. X
  956. X/* xvectorp - built-in function 'vector?' */
  957. XLVAL xvectorp()
  958. X{
  959. X    LVAL arg;
  960. X    arg = xlgetarg();
  961. X    xllastarg();
  962. X    return (vectorp(arg) ? true : NIL);
  963. X}
  964. X
  965. X/* xprocedurep - built-in function 'procedure?' */
  966. XLVAL xprocedurep()
  967. X{
  968. X    LVAL arg;
  969. X    arg = xlgetarg();
  970. X    xllastarg();
  971. X    return (closurep(arg) ? true : NIL);
  972. X}
  973. X
  974. X/* xobjectp - built-in function 'object?' */
  975. XLVAL xobjectp()
  976. X{
  977. X    LVAL arg;
  978. X    arg = xlgetarg();
  979. X    xllastarg();
  980. X    return (closurep(arg) ? true : NIL);
  981. X}
  982. X
  983. X/* xdefaultobjectp - built-in function 'default-object?' */
  984. XLVAL xdefaultobjectp()
  985. X{
  986. X    LVAL arg;
  987. X    arg = xlgetarg();
  988. X    xllastarg();
  989. X    return (arg == default_object ? true : NIL);
  990. X}
  991. X
  992. X/* xeq - built-in function 'eq?' */
  993. XLVAL xeq()
  994. X{
  995. X    return (eqtest(eq));
  996. X}
  997. X
  998. X/* xeqv - built-in function 'eqv?' */
  999. XLVAL xeqv()
  1000. X{
  1001. X    return (eqtest(eqv));
  1002. X}
  1003. X
  1004. X/* xequal - built-in function 'equal?' */
  1005. XLVAL xequal()
  1006. X{
  1007. X    return (eqtest(equal));
  1008. X}
  1009. X
  1010. X/* eqtest - common code for eq?/eqv?/equal? */
  1011. XLOCAL LVAL eqtest(fcn)
  1012. X  int (*fcn)();
  1013. X{
  1014. X    LVAL arg1,arg2;
  1015. X    arg1 = xlgetarg();
  1016. X    arg2 = xlgetarg();
  1017. X    xllastarg();
  1018. X    return ((*fcn)(arg1,arg2) ? true : NIL);
  1019. X}
  1020. X
  1021. X/* xgensym - generate a symbol */
  1022. XLVAL xgensym()
  1023. X{
  1024. X    char sym[STRMAX+11]; /* enough space for prefix and number */
  1025. X    LVAL x;
  1026. X
  1027. X    /* get the prefix or number */
  1028. X    if (moreargs()) {
  1029. X    x = xlgetarg();
  1030. X    switch (ntype(x)) {
  1031. X    case SYMBOL:
  1032. X        x = getpname(x);
  1033. X    case STRING:
  1034. X        strncpy(gsprefix,getstring(x),STRMAX);
  1035. X        gsprefix[STRMAX] = '\0';
  1036. X        break;
  1037. X    case FIXNUM:
  1038. X        gsnumber = getfixnum(x);
  1039. X        break;
  1040. X    default:
  1041. X        xlerror("bad argument type",x);
  1042. X    }
  1043. X    }
  1044. X    xllastarg();
  1045. X
  1046. X    /* create the pname of the new symbol */
  1047. X    sprintf(sym,"%s%d",gsprefix,gsnumber++);
  1048. X
  1049. X    /* make a symbol with this print name */
  1050. X    return (cvsymbol(sym));
  1051. X}
  1052. END_OF_FILE
  1053. if test 19708 -ne `wc -c <'Src/xsfun1.c'`; then
  1054.     echo shar: \"'Src/xsfun1.c'\" unpacked with wrong size!
  1055. fi
  1056. # end of 'Src/xsfun1.c'
  1057. fi
  1058. if test -f 'Src/xsfun2.c' -a "${1}" != "-c" ; then 
  1059.   echo shar: Will not clobber existing file \"'Src/xsfun2.c'\"
  1060. else
  1061. echo shar: Extracting \"'Src/xsfun2.c'\" \(27271 characters\)
  1062. sed "s/^X//" >'Src/xsfun2.c' <<'END_OF_FILE'
  1063. X/* xsfun2.c - xscheme built-in functions - part 2 */
  1064. X/*    Copyright (c) 1988, by David Michael Betz
  1065. X    All Rights Reserved
  1066. X    Permission is granted for unrestricted non-commercial use    */
  1067. X
  1068. X#include "xscheme.h"
  1069. X
  1070. X/* external variables */
  1071. Xextern jmp_buf top_level;
  1072. Xextern LVAL eof_object,true;
  1073. Xextern LVAL xlfun,xlenv,xlval;
  1074. Xextern int prbreadth,prdepth;
  1075. Xextern FILE *tfp;
  1076. X
  1077. X/* external routines */
  1078. Xextern xlprin1(),xlprinc();
  1079. X
  1080. X/* forward declarations */
  1081. XFORWARD LVAL setit();
  1082. XFORWARD LVAL strcompare();
  1083. XFORWARD LVAL chrcompare();
  1084. X
  1085. X/* xapply - built-in function 'apply' */
  1086. XLVAL xapply()
  1087. X{
  1088. X    LVAL args,*p;
  1089. X
  1090. X    /* get the function and argument list */
  1091. X    xlval = xlgetarg();
  1092. X    args = xlgalist();
  1093. X    xllastarg();
  1094. X
  1095. X    /* get the argument count and make space on the stack */
  1096. X    xlargc = length(args);
  1097. X    check(xlargc);
  1098. X
  1099. X    /* copy the arguments onto the stack */
  1100. X    for (xlsp -= xlargc, p = xlsp; consp(args); args = cdr(args))
  1101. X    *p++ = car(args);
  1102. X
  1103. X    /* apply the function to the arguments */
  1104. X    xlapply();
  1105. X}
  1106. X
  1107. X/* xcallcc - built-in function 'call-with-current-continuation' */
  1108. XLVAL xcallcc()
  1109. X{
  1110. X    LVAL cont,*src,*dst;
  1111. X    int size;
  1112. X
  1113. X    /* get the function to call */
  1114. X    xlval = xlgetarg();
  1115. X    xllastarg();
  1116. X
  1117. X    /* create a continuation object */
  1118. X    size = (int)(xlstktop - xlsp);
  1119. X    cont = newcontinuation(size);
  1120. X    for (src = xlsp, dst = &cont->n_vdata[0]; --size >= 0; )
  1121. X    *dst++ = *src++;
  1122. X
  1123. X    /* setup the argument list */
  1124. X    cpush(cont);
  1125. X    xlargc = 1;
  1126. X
  1127. X    /* apply the function */
  1128. X    xlapply();
  1129. X}
  1130. X
  1131. X/* xmap - built-in function 'map' */
  1132. XLVAL xmap()
  1133. X{
  1134. X    if (xlargc < 2) xltoofew();
  1135. X    xlval = NIL;
  1136. X    do_maploop(NIL);
  1137. X}
  1138. X
  1139. X/* do_maploop - setup for the next application */
  1140. Xdo_maploop(last)
  1141. X  LVAL last;
  1142. X{
  1143. X    extern LVAL cs_map1;
  1144. X    LVAL *oldsp,*p,x;
  1145. X    int cnt;
  1146. X
  1147. X    /* get a pointer to the end of the argument list */
  1148. X    p = &xlsp[xlargc];
  1149. X    oldsp = xlsp;
  1150. X
  1151. X    /* save a continuation */
  1152. X    if (xlval) { check(5); push(xlval); push(last); }
  1153. X    else       { check(4); push(NIL); }
  1154. X    push(cvfixnum((FIXTYPE)xlargc));
  1155. X    push(cs_map1);
  1156. X    push(xlenv);
  1157. X
  1158. X    /* build the argument list for the next application */
  1159. X    for (cnt = xlargc; --cnt >= 1; ) {
  1160. X    x = *--p;
  1161. X    if (consp(x)) {
  1162. X        cpush(car(x));
  1163. X        *p = cdr(x);
  1164. X    }
  1165. X    else {
  1166. X        xlsp = oldsp;
  1167. X        drop(xlargc);
  1168. X        xlreturn();
  1169. X        return;
  1170. X    }
  1171. X    }
  1172. X    xlval = *--p;    /* get the function to apply */
  1173. X    xlargc -= 1;    /* count shouldn't include the function itself */
  1174. X    xlapply();        /* apply the function */
  1175. X}
  1176. X
  1177. X/* xmap1 - continuation for xmap */
  1178. XLVAL xmap1()
  1179. X{
  1180. X    LVAL last,tmp;
  1181. X
  1182. X    /* get the argument count */
  1183. X    tmp = pop();
  1184. X
  1185. X    /* get the tail of the value list */
  1186. X    if (last = pop()) {
  1187. X    rplacd(last,cons(xlval,NIL));    /* add the new value to the tail */
  1188. X    last = cdr(last);        /* remember the new tail */
  1189. X    xlval = pop();            /* restore the head of the list */
  1190. X    }
  1191. X    else
  1192. X    xlval = last = cons(xlval,NIL);    /* build the initial value list */
  1193. X    
  1194. X    /* convert the argument count and loop */
  1195. X    xlargc = (int)getfixnum(tmp);
  1196. X    do_maploop(last);
  1197. X}
  1198. X
  1199. X/* xforeach - built-in function 'for-each' */
  1200. XLVAL xforeach()
  1201. X{
  1202. X    if (xlargc < 2) xltoofew();
  1203. X    do_forloop();
  1204. X}
  1205. X
  1206. X/* do_forloop - setup for the next application */
  1207. Xdo_forloop()
  1208. X{
  1209. X    extern LVAL cs_foreach1;
  1210. X    LVAL *oldsp,*p,x;
  1211. X    int cnt;
  1212. X
  1213. X    /* get a pointer to the end of the argument list */
  1214. X    p = &xlsp[xlargc];
  1215. X    oldsp = xlsp;
  1216. X
  1217. X    /* save a continuation */
  1218. X    check(3);
  1219. X    push(cvfixnum((FIXTYPE)xlargc));
  1220. X    push(cs_foreach1);
  1221. X    push(xlenv);
  1222. X
  1223. X    /* build the argument list for the next application */
  1224. X    for (cnt = xlargc; --cnt >= 1; ) {
  1225. X    x = *--p;
  1226. X    if (consp(x)) {
  1227. X        cpush(car(x));
  1228. X        *p = cdr(x);
  1229. X    }
  1230. X    else {
  1231. X        xlsp = oldsp;
  1232. X        drop(xlargc);
  1233. X        xlval = NIL;
  1234. X        xlreturn();
  1235. X        return;
  1236. X    }
  1237. X    }
  1238. X    xlval = *--p;    /* get the function to apply */
  1239. X    xlargc -= 1;    /* count shouldn't include the function itself */
  1240. X    xlapply();        /* apply the function */
  1241. X}
  1242. X
  1243. X/* xforeach1 - continuation for xforeach */
  1244. XLVAL xforeach1()
  1245. X{
  1246. X    LVAL tmp;
  1247. X
  1248. X    /* get the argument count */
  1249. X    tmp = pop();
  1250. X
  1251. X    /* convert the argument count and loop */
  1252. X    xlargc = (int)getfixnum(tmp);
  1253. X    do_forloop();
  1254. X}
  1255. X
  1256. X/* xcallwi - built-in function 'call-with-input-file' */
  1257. XLVAL xcallwi()
  1258. X{
  1259. X    do_withfile(PF_INPUT,"r");
  1260. X}
  1261. X
  1262. X/* xcallwo - built-in function 'call-with-output-file' */
  1263. XLVAL xcallwo()
  1264. X{
  1265. X    do_withfile(PF_OUTPUT,"w");
  1266. X}
  1267. X
  1268. X/* do_withfile - handle the 'call-with-xxx-file' functions */
  1269. Xdo_withfile(flags,mode)
  1270. X  int flags; char *mode;
  1271. X{
  1272. X    extern LVAL cs_withfile1;
  1273. X    extern FILE *osaopen();
  1274. X    LVAL name,file;
  1275. X    FILE *fp;
  1276. X
  1277. X    /* get the function to call */
  1278. X    name = xlgastring();
  1279. X    xlval = xlgetarg();
  1280. X    xllastarg();
  1281. X
  1282. X    /* create a file object */
  1283. X    file = cvport(NULL,flags);
  1284. X    if ((fp = osaopen(getstring(name),mode)) == NULL)
  1285. X    xlerror("can't open file",name);
  1286. X    setfile(file,fp);
  1287. X
  1288. X    /* save a continuation */
  1289. X    check(3);
  1290. X    push(file);
  1291. X    push(cs_withfile1);
  1292. X    push(xlenv);
  1293. X
  1294. X    /* setup the argument list */
  1295. X    cpush(file);
  1296. X    xlargc = 1;
  1297. X
  1298. X    /* apply the function */
  1299. X    xlapply();
  1300. X}
  1301. X
  1302. X/* xwithfile1 - continuation for xcallwi and xcallwo */
  1303. XLVAL xwithfile1()
  1304. X{
  1305. X    osclose(getfile(top()));
  1306. X    setfile(pop(),NULL);
  1307. X    xlreturn();
  1308. X}
  1309. X
  1310. X/* xload - built-in function 'load' */
  1311. XLVAL xload()
  1312. X{
  1313. X    do_load(NIL);
  1314. X}
  1315. X
  1316. X/* xloadnoisily - built-in function 'load-noisily' */
  1317. XLVAL xloadnoisily()
  1318. X{
  1319. X    do_load(true);
  1320. X}
  1321. X
  1322. X/* do_load - open the file and setup the load loop */
  1323. Xdo_load(print)
  1324. X  LVAL print;
  1325. X{
  1326. X    extern FILE *osaopen();
  1327. X    LVAL file;
  1328. X    FILE *fp;
  1329. X
  1330. X    /* get the function to call */
  1331. X    xlval = xlgastring();
  1332. X    xllastarg();
  1333. X
  1334. X    /* create a file object */
  1335. X    file = cvport(NULL,PF_INPUT);
  1336. X    if ((fp = osaopen(getstring(xlval),"r")) == NULL) {
  1337. X    xlval = NIL;
  1338. X    xlreturn();
  1339. X    return;
  1340. X    }
  1341. X    setfile(file,fp);
  1342. X    xlval = file;
  1343. X
  1344. X    /* do the first read */
  1345. X    do_loadloop(print);
  1346. X}
  1347. X
  1348. X/* do_loadloop - read the next expression and setup to evaluate it */
  1349. Xdo_loadloop(print)
  1350. X  LVAL print;
  1351. X{
  1352. X    extern LVAL cs_load1,s_eval;
  1353. X    LVAL expr;
  1354. X    
  1355. X    /* try to read the next expression from the file */
  1356. X    if (xlread(xlval,&expr)) {
  1357. X
  1358. X    /* save a continuation */
  1359. X    check(4);
  1360. X    push(xlval);
  1361. X    push(print);
  1362. X    push(cs_load1);
  1363. X    push(xlenv);
  1364. X
  1365. X    /* setup the argument list */
  1366. X    xlval = getvalue(s_eval);
  1367. X    cpush(expr);
  1368. X    xlargc = 1;
  1369. X
  1370. X    /* apply the function */
  1371. X    xlapply();
  1372. X    }
  1373. X    else {
  1374. X    osclose(getfile(xlval));
  1375. X    setfile(xlval,NULL);
  1376. X    xlval = true;
  1377. X    xlreturn();
  1378. X    }
  1379. X}
  1380. X
  1381. X/* xload1 - continuation for xload */
  1382. XLVAL xload1()
  1383. X{
  1384. X    LVAL print;
  1385. X
  1386. X    /* print the value if the print variable is set */
  1387. X    if (print = pop()) {
  1388. X    xlprin1(xlval,curoutput());
  1389. X    xlterpri(curoutput());
  1390. X    }
  1391. X    xlval = pop();
  1392. X    
  1393. X    /* setup for the next read */
  1394. X    do_loadloop(print);
  1395. X}
  1396. X
  1397. X/* xforce - built-in function 'force' */
  1398. XLVAL xforce()
  1399. X{
  1400. X    extern LVAL cs_force1;
  1401. X
  1402. X    /* get the promise */
  1403. X    xlval = xlgetarg();
  1404. X    xllastarg();
  1405. X
  1406. X    /* check for a promise */
  1407. X    if (promisep(xlval)) {
  1408. X
  1409. X    /* force the promise the first time */
  1410. X    if ((xlfun = getpproc(xlval)) != NIL) {
  1411. X        check(3);
  1412. X        push(xlval);
  1413. X        push(cs_force1);
  1414. X        push(xlenv);
  1415. X        xlval = xlfun;
  1416. X        xlargc = 0;
  1417. X        xlapply();
  1418. X    }
  1419. X
  1420. X    /* return the saved value if the promise has already been forced */
  1421. X    else {
  1422. X        xlval = getpvalue(xlval);
  1423. X        xlreturn();
  1424. X    }
  1425. X    
  1426. X    }
  1427. X    
  1428. X    /* otherwise, just return the argument */
  1429. X    else
  1430. X    xlreturn();
  1431. X}
  1432. X
  1433. X/* xforce1 - continuation for xforce */
  1434. XLVAL xforce1()
  1435. X{
  1436. X    LVAL promise;
  1437. X    promise = pop();
  1438. X    setpvalue(promise,xlval);
  1439. X    setpproc(promise,NIL);
  1440. X    xlreturn();
  1441. X}
  1442. X
  1443. X/* xsymstr - built-in function 'symbol->string' */
  1444. XLVAL xsymstr()
  1445. X{
  1446. X    xlval = xlgasymbol();
  1447. X    xllastarg();
  1448. X    return (getpname(xlval));
  1449. X}
  1450. X
  1451. X/* xstrsym - built-in function 'string->symbol' */
  1452. XLVAL xstrsym()
  1453. X{
  1454. X    xlval = xlgastring();
  1455. X    xllastarg();
  1456. X    return (xlenter(getstring(xlval)));
  1457. X}
  1458. X
  1459. X/* xread - built-in function 'read' */
  1460. XLVAL xread()
  1461. X{
  1462. X    LVAL fptr,val;
  1463. X
  1464. X    /* get file pointer and eof value */
  1465. X    fptr = (moreargs() ? xlgaiport() : curinput());
  1466. X    xllastarg();
  1467. X
  1468. X    /* read an expression */
  1469. X    if (!xlread(fptr,&val))
  1470. X    val = eof_object;
  1471. X
  1472. X    /* return the expression */
  1473. X    return (val);
  1474. X}
  1475. X
  1476. X/* xrdchar - built-in function 'read-char' */
  1477. XLVAL xrdchar()
  1478. X{
  1479. X    LVAL fptr;
  1480. X    int ch;
  1481. X    fptr = (moreargs() ? xlgaiport() : curinput());
  1482. X    xllastarg();
  1483. X    return ((ch = xlgetc(fptr)) == EOF ? eof_object : cvchar(ch));
  1484. X}
  1485. X
  1486. X/* xrdbyte - built-in function 'read-byte' */
  1487. XLVAL xrdbyte()
  1488. X{
  1489. X    LVAL fptr;
  1490. X    int ch;
  1491. X    fptr = (moreargs() ? xlgaiport() : curinput());
  1492. X    xllastarg();
  1493. X    return ((ch = xlgetc(fptr)) == EOF ? eof_object : cvfixnum((FIXTYPE)ch));
  1494. X}
  1495. X
  1496. X/* xrdshort - built-in function 'read-short' */
  1497. XLVAL xrdshort()
  1498. X{
  1499. X    unsigned char *p;
  1500. X    short int val=0;
  1501. X    LVAL fptr;
  1502. X    int ch,n;
  1503. X    fptr = (moreargs() ? xlgaiport() : curinput());
  1504. X    xllastarg();
  1505. X    for (n = sizeof(short int), p = (unsigned char *)&val; --n >= 0; ) {
  1506. X        if ((ch = xlgetc(fptr)) == EOF)
  1507. X        return (eof_object);
  1508. X        *p++ = ch;
  1509. X    }
  1510. X    return (cvfixnum((FIXTYPE)val));
  1511. X}
  1512. X
  1513. X/* xrdlong - built-in function 'read-long' */
  1514. XLVAL xrdlong()
  1515. X{
  1516. X    unsigned char *p;
  1517. X    long int val=0;
  1518. X    LVAL fptr;
  1519. X    int ch,n;
  1520. X    fptr = (moreargs() ? xlgaiport() : curinput());
  1521. X    xllastarg();
  1522. X    for (n = sizeof(long int), p = (unsigned char *)&val; --n >= 0; ) {
  1523. X        if ((ch = xlgetc(fptr)) == EOF)
  1524. X        return (eof_object);
  1525. X        *p++ = ch;
  1526. X    }
  1527. X    return (cvfixnum((FIXTYPE)val));
  1528. X}
  1529. X
  1530. X/* xeofobjectp - built-in function 'eof-object?' */
  1531. XLVAL xeofobjectp()
  1532. X{
  1533. X    LVAL arg;
  1534. X    arg = xlgetarg();
  1535. X    xllastarg();
  1536. X    return (arg == eof_object ? true : NIL);
  1537. X}
  1538. X
  1539. X/* xwrite - built-in function 'write' */
  1540. XLVAL xwrite()
  1541. X{
  1542. X    LVAL fptr,val;
  1543. X
  1544. X    /* get expression to print and file pointer */
  1545. X    val = xlgetarg();
  1546. X    fptr = (moreargs() ? xlgaoport() : curoutput());
  1547. X    xllastarg();
  1548. X
  1549. X    /* print the value */
  1550. X    xlprin1(val,fptr);
  1551. X    return (true);
  1552. X}
  1553. X
  1554. X/* xprint - built-in function 'print' */
  1555. XLVAL xprint()
  1556. X{
  1557. X    LVAL fptr,val;
  1558. X
  1559. X    /* get expression to print and file pointer */
  1560. X    val = xlgetarg();
  1561. X    fptr = (moreargs() ? xlgaoport() : curoutput());
  1562. X    xllastarg();
  1563. X
  1564. X    /* print the value */
  1565. X    xlprin1(val,fptr);
  1566. X    xlterpri(fptr);
  1567. X    return (true);
  1568. X}
  1569. X
  1570. X/* xwrchar - built-in function 'write-char' */
  1571. XLVAL xwrchar()
  1572. X{
  1573. X    LVAL fptr,ch;
  1574. X    ch = xlgachar();
  1575. X    fptr = (moreargs() ? xlgaoport() : curoutput());
  1576. X    xllastarg();
  1577. X    xlputc(fptr,(int)getchcode(ch));
  1578. X    return (true);
  1579. X}
  1580. X
  1581. X/* xwrbyte - built-in function 'write-byte' */
  1582. XLVAL xwrbyte()
  1583. X{
  1584. X    LVAL fptr,ch;
  1585. X    ch = xlgafixnum();
  1586. X    fptr = (moreargs() ? xlgaoport() : curoutput());
  1587. X    xllastarg();
  1588. X    xlputc(fptr,(int)getfixnum(ch));
  1589. X    return (true);
  1590. X}
  1591. X
  1592. X/* xwrshort - built-in function 'write-short' */
  1593. XLVAL xwrshort()
  1594. X{
  1595. X    unsigned char *p;
  1596. X    short int val;
  1597. X    LVAL fptr,v;
  1598. X    int n;
  1599. X    v = xlgafixnum(); val = (short int)getfixnum(v);
  1600. X    fptr = (moreargs() ? xlgaoport() : curoutput());
  1601. X    xllastarg();
  1602. X    for (n = sizeof(short int), p = (unsigned char *)&val; --n >= 0; )
  1603. X        xlputc(fptr,*p++);
  1604. X    return (true);
  1605. X}
  1606. X
  1607. X/* xwrlong - built-in function 'write-long' */
  1608. XLVAL xwrlong()
  1609. X{
  1610. X    unsigned char *p;
  1611. X    long int val;
  1612. X    LVAL fptr,v;
  1613. X    int n;
  1614. X    v = xlgafixnum(); val = (long int)getfixnum(v);
  1615. X    fptr = (moreargs() ? xlgaoport() : curoutput());
  1616. X    xllastarg();
  1617. X    for (n = sizeof(long int), p = (unsigned char *)&val; --n >= 0; )
  1618. X        xlputc(fptr,*p++);
  1619. X    return (true);
  1620. X}
  1621. X
  1622. X/* xdisplay - built-in function 'display' */
  1623. XLVAL xdisplay()
  1624. X{
  1625. X    LVAL fptr,val;
  1626. X
  1627. X    /* get expression to print and file pointer */
  1628. X    val = xlgetarg();
  1629. X    fptr = (moreargs() ? xlgaoport() : curoutput());
  1630. X    xllastarg();
  1631. X
  1632. X    /* print the value */
  1633. X    xlprinc(val,fptr);
  1634. X    return (true);
  1635. X}
  1636. X
  1637. X/* xnewline - terminate the current print line */
  1638. XLVAL xnewline()
  1639. X{
  1640. X    LVAL fptr;
  1641. X
  1642. X    /* get file pointer */
  1643. X    fptr = (moreargs() ? xlgaoport() : curoutput());
  1644. X    xllastarg();
  1645. X
  1646. X    /* terminate the print line and return nil */
  1647. X    xlterpri(fptr);
  1648. X    return (true);
  1649. X}
  1650. X
  1651. X/* xprbreadth - set the maximum number of elements to be printed */
  1652. XLVAL xprbreadth()
  1653. X{
  1654. X    return (setit(&prbreadth));
  1655. X}
  1656. X
  1657. X/* xprdepth - set the maximum depth of nested lists to be printed */
  1658. XLVAL xprdepth()
  1659. X{
  1660. X    return (setit(&prdepth));
  1661. X}
  1662. X
  1663. X/* setit - common routine for prbreadth/prdepth */
  1664. XLOCAL LVAL setit(pvar)
  1665. X  int *pvar;
  1666. X{
  1667. X    LVAL arg;
  1668. X
  1669. X    /* get the optional argument */
  1670. X    if (moreargs()) {
  1671. X    arg = xlgetarg();
  1672. X    xllastarg();
  1673. X    *pvar = (fixp(arg) ? (int)getfixnum(arg) : -1);
  1674. X    }
  1675. X
  1676. X    /* return the value of the variable */
  1677. X    return (*pvar >= 0 ? cvfixnum((FIXTYPE)*pvar) : NIL);
  1678. X}
  1679. X
  1680. X/* xopeni - built-in function 'open-input-file' */
  1681. XLVAL xopeni()
  1682. X{
  1683. X    LVAL openfile();
  1684. X    return (openfile(PF_INPUT,"r"));
  1685. X}
  1686. X
  1687. X/* xopeno - built-in function 'open-output-file' */
  1688. XLVAL xopeno()
  1689. X{
  1690. X    LVAL openfile();
  1691. X    return (openfile(PF_OUTPUT,"w"));
  1692. X}
  1693. X
  1694. X/* xopena - built-in function 'open-append-file' */
  1695. XLVAL xopena()
  1696. X{
  1697. X    LVAL openfile();
  1698. X    return (openfile(PF_OUTPUT,"a"));
  1699. X}
  1700. X
  1701. X/* xopenu - built-in function 'open-update-file' */
  1702. XLVAL xopenu()
  1703. X{
  1704. X    LVAL openfile();
  1705. X    return (openfile(PF_INPUT|PF_OUTPUT,"r+"));
  1706. X}
  1707. X
  1708. X/* openfile - open an ascii or binary file */
  1709. XLOCAL LVAL openfile(flags,mode)
  1710. X  int flags; char *mode;
  1711. X{
  1712. X    extern FILE *osaopen(),*osbopen();
  1713. X    LVAL file,modekey;
  1714. X    char *name;
  1715. X    FILE *fp;
  1716. X
  1717. X    /* get the file name and direction */
  1718. X    name = (char *)getstring(xlgastring());
  1719. X    modekey = (moreargs() ? xlgasymbol() : NIL);
  1720. X    xllastarg();
  1721. X
  1722. X    /* check for binary mode */
  1723. X    if (modekey != NIL) {
  1724. X    if (modekey == xlenter("BINARY"))
  1725. X        flags |= PF_BINARY;
  1726. X    else if (modekey != xlenter("TEXT"))
  1727. X        xlerror("unrecognized open mode",modekey);
  1728. X    }
  1729. X
  1730. X    /* try to open the file */
  1731. X    file = cvport(NULL,flags);
  1732. X    fp = ((flags & PF_BINARY) == 0 ? osaopen(name,mode) : osbopen(name,mode));
  1733. X    if (fp == NULL)
  1734. X    return (NIL);
  1735. X    setfile(file,fp);
  1736. X    return (file);
  1737. X}
  1738. X
  1739. X/* xclose - built-in function 'close-port' */
  1740. XLVAL xclose()
  1741. X{
  1742. X    LVAL fptr;
  1743. X    fptr = xlgaport();
  1744. X    xllastarg();
  1745. X    if (getfile(fptr))
  1746. X    osclose(getfile(fptr));
  1747. X    setfile(fptr,NULL);
  1748. X    return (NIL);
  1749. X}
  1750. X
  1751. X/* xclosei - built-in function 'close-input-port' */
  1752. XLVAL xclosei()
  1753. X{
  1754. X    LVAL fptr;
  1755. X    fptr = xlgaiport();
  1756. X    xllastarg();
  1757. X    if (getfile(fptr))
  1758. X    osclose(getfile(fptr));
  1759. X    setfile(fptr,NULL);
  1760. X    return (NIL);
  1761. X}
  1762. X
  1763. X/* xcloseo - built-in function 'close-output-port' */
  1764. XLVAL xcloseo()
  1765. X{
  1766. X    LVAL fptr;
  1767. X    fptr = xlgaoport();
  1768. X    xllastarg();
  1769. X    if (getfile(fptr))
  1770. X    osclose(getfile(fptr));
  1771. X    setfile(fptr,NULL);
  1772. X    return (NIL);
  1773. X}
  1774. X
  1775. X/* xgetfposition - built-in function 'get-file-position' */
  1776. XLVAL xgetfposition()
  1777. X{
  1778. X    extern long ostell();
  1779. X    LVAL fptr;
  1780. X    fptr = xlgaport();
  1781. X    xllastarg();
  1782. X    return (cvfixnum(ostell(getfile(fptr))));
  1783. X}
  1784. X
  1785. X/* xsetfposition - built-in function 'set-file-position!' */
  1786. XLVAL xsetfposition()
  1787. X{
  1788. X    LVAL fptr,val;
  1789. X    long position;
  1790. X    int whence;
  1791. X    fptr = xlgaport();
  1792. X    val = xlgafixnum(); position = getfixnum(val);
  1793. X    val = xlgafixnum(); whence = (int)getfixnum(val);
  1794. X    xllastarg();
  1795. X    return (osseek(getfile(fptr),position,whence) == 0 ? true : NIL);
  1796. X}
  1797. X
  1798. X/* xcurinput - built-in function 'current-input-port' */
  1799. XLVAL xcurinput()
  1800. X{
  1801. X    xllastarg();
  1802. X    return (curinput());
  1803. X}
  1804. X
  1805. X/* xcuroutput - built-in function 'current-output-port' */
  1806. XLVAL xcuroutput()
  1807. X{
  1808. X    xllastarg();
  1809. X    return (curoutput());
  1810. X}
  1811. X
  1812. X/* xportp - built-in function 'port?' */
  1813. XLVAL xportp()
  1814. X{
  1815. X    LVAL arg;
  1816. X    arg = xlgetarg();
  1817. X    xllastarg();
  1818. X    return (portp(arg) ? true : NIL);
  1819. X}
  1820. X
  1821. X/* xinputportp - built-in function 'input-port?' */
  1822. XLVAL xinputportp()
  1823. X{
  1824. X    LVAL arg;
  1825. X    arg = xlgetarg();
  1826. X    xllastarg();
  1827. X    return (iportp(arg) ? true : NIL);
  1828. X}
  1829. X
  1830. X/* xoutputportp - built-in function 'output-port?' */
  1831. XLVAL xoutputportp()
  1832. X{
  1833. X    LVAL arg;
  1834. X    arg = xlgetarg();
  1835. X    xllastarg();
  1836. X    return (oportp(arg) ? true : NIL);
  1837. X}
  1838. X
  1839. X/* xtranson - built-in function 'transcript-on' */
  1840. XLVAL xtranson()
  1841. X{
  1842. X    extern FILE *osaopen();
  1843. X    char *name;
  1844. X
  1845. X    /* get the file name and direction */
  1846. X    name = (char *)getstring(xlgastring());
  1847. X    xllastarg();
  1848. X
  1849. X    /* close any currently open transcript file */
  1850. X    if (tfp) { osclose(tfp); tfp = NULL; }
  1851. X
  1852. X    /* try to open the file */
  1853. X    return ((tfp = osaopen(name,"w")) == NULL ? NIL : true);
  1854. X}
  1855. X
  1856. X/* xtransoff - built-in function 'transcript-off' */
  1857. XLVAL xtransoff()
  1858. X{
  1859. X    /* make sure there aren't any arguments */
  1860. X    xllastarg();
  1861. X
  1862. X    /* make sure the transcript is open */
  1863. X    if (tfp == NULL)
  1864. X    return (NIL);
  1865. X
  1866. X    /* close the transcript and return successfully */
  1867. X    osclose(tfp); tfp = NULL;
  1868. X    return (true);
  1869. X}
  1870. X
  1871. X/* xstrlen - built-in function 'string-length' */
  1872. XLVAL xstrlen()
  1873. X{
  1874. X    LVAL str;
  1875. X    str = xlgastring();
  1876. X    xllastarg();
  1877. X    return (cvfixnum((FIXTYPE)(getslength(str)-1)));
  1878. X}
  1879. X
  1880. X/* xstrnullp - built-in function 'string-null?' */
  1881. XLVAL xstrnullp()
  1882. X{
  1883. X    LVAL str;
  1884. X    str = xlgastring();
  1885. X    xllastarg();
  1886. X    return (getslength(str) == 1 ? true : NIL);
  1887. X}
  1888. X
  1889. X/* xstrappend - built-in function 'string-append' */
  1890. XLVAL xstrappend()
  1891. X{
  1892. X    LVAL *savesp,tmp,val;
  1893. X    unsigned char *str;
  1894. X    int saveargc,len;
  1895. X
  1896. X    /* save the argument list */
  1897. X    saveargc = xlargc;
  1898. X    savesp = xlsp;
  1899. X
  1900. X    /* find the length of the new string */
  1901. X    for (len = 0; moreargs(); ) {
  1902. X    tmp = xlgastring();
  1903. X    len += (int)getslength(tmp) - 1;
  1904. X    }
  1905. X
  1906. X    /* restore the argument list */
  1907. X    xlargc = saveargc;
  1908. X    xlsp = savesp;
  1909. X    
  1910. X    /* create the result string */
  1911. X    val = newstring(len+1);
  1912. X    str = getstring(val);
  1913. X
  1914. X    /* combine the strings */
  1915. X    for (*str = '\0'; moreargs(); ) {
  1916. X    tmp = nextarg();
  1917. X    strcat(str,getstring(tmp));
  1918. X    }
  1919. X
  1920. X    /* return the new string */
  1921. X    return (val);
  1922. X}
  1923. X
  1924. X/* xstrref - built-in function 'string-ref' */
  1925. XLVAL xstrref()
  1926. X{
  1927. X    LVAL str,num;
  1928. X    int n;
  1929. X
  1930. X    /* get the string and the index */
  1931. X    str = xlgastring();
  1932. X    num = xlgafixnum();
  1933. X    xllastarg();
  1934. X
  1935. X    /* range check the index */
  1936. X    if ((n = (int)getfixnum(num)) < 0 || n >= getslength(str) - 1)
  1937. X    xlerror("index out of range",num);
  1938. X
  1939. X    /* return the character */
  1940. X    return (cvchar(getstring(str)[n]));
  1941. X}
  1942. X
  1943. X/* xsubstring - built-in function 'substring' */
  1944. XLVAL xsubstring()
  1945. X{
  1946. X    unsigned char *srcp,*dstp;
  1947. X    int start,end,len;
  1948. X    LVAL src,dst;
  1949. X
  1950. X    /* get string and starting and ending positions */
  1951. X    src = xlgastring();
  1952. X
  1953. X    /* get the starting position */
  1954. X    dst = xlgafixnum(); start = (int)getfixnum(dst);
  1955. X    if (start < 0 || start > getslength(src) - 1)
  1956. X    xlerror("index out of range",dst);
  1957. X
  1958. X    /* get the ending position */
  1959. X    if (moreargs()) {
  1960. X    dst = xlgafixnum(); end = (int)getfixnum(dst);
  1961. X    if (end < 0 || end > getslength(src) - 1)
  1962. X        xlerror("index out of range",dst);
  1963. X    }
  1964. X    else
  1965. X    end = getslength(src) - 1;
  1966. X    xllastarg();
  1967. X
  1968. X    /* setup the source pointer */
  1969. X    srcp = getstring(src) + start;
  1970. X    len = end - start;
  1971. X
  1972. X    /* make a destination string and setup the pointer */
  1973. X    dst = newstring(len+1);
  1974. X    dstp = getstring(dst);
  1975. X
  1976. X    /* copy the source to the destination */
  1977. X    while (--len >= 0)
  1978. X    *dstp++ = *srcp++;
  1979. X    *dstp = '\0';
  1980. X
  1981. X    /* return the substring */
  1982. X    return (dst);
  1983. X}
  1984. X
  1985. X/* xstrlist - built-in function 'string->list' */
  1986. XLVAL xstrlist()
  1987. X{
  1988. X    unsigned char *p;
  1989. X    LVAL str;
  1990. X    int size;
  1991. X
  1992. X    /* get the vector */
  1993. X    str = xlgastring();
  1994. X    xllastarg();
  1995. X    
  1996. X    /* make a list from the vector */
  1997. X    cpush(str);
  1998. X    size = getslength(str)-1;
  1999. X    for (xlval = NIL, p = &getstring(str)[size]; --size >= 0; )
  2000. X    xlval = cons(cvchar(*--p),xlval);
  2001. X    drop(1);
  2002. X    return (xlval);
  2003. X}
  2004. X
  2005. X/* xliststring - built-in function 'list->string' */
  2006. XLVAL xliststring()
  2007. X{
  2008. X    unsigned char *p;
  2009. X    LVAL str;
  2010. X    int size;
  2011. X
  2012. X    /* get the list */
  2013. X    xlval = xlgalist();
  2014. X    xllastarg();
  2015. X
  2016. X    /* make a vector from the list */
  2017. X    size = length(xlval);
  2018. X    str = newstring(size+1);
  2019. X    for (p = getstring(str); --size >= 0; xlval = cdr(xlval))
  2020. X    if (charp(car(xlval)))
  2021. X        *p++ = getchcode(car(xlval));
  2022. X    else
  2023. X        xlbadtype(car(xlval));
  2024. X    *p = '\0';
  2025. X    return (str);
  2026. X}
  2027. X
  2028. X/* string comparision functions */
  2029. XLVAL xstrlss() { return (strcompare('<',FALSE)); } /* string<? */
  2030. XLVAL xstrleq() { return (strcompare('L',FALSE)); } /* string<=? */
  2031. XLVAL xstreql() { return (strcompare('=',FALSE)); } /* string=? */
  2032. XLVAL xstrgeq() { return (strcompare('G',FALSE)); } /* string>=? */
  2033. XLVAL xstrgtr() { return (strcompare('>',FALSE)); } /* string>? */
  2034. X
  2035. X/* string comparison functions (case insensitive) */
  2036. XLVAL xstrilss() { return (strcompare('<',TRUE)); } /* string-ci<? */
  2037. XLVAL xstrileq() { return (strcompare('L',TRUE)); } /* string-ci<=? */
  2038. XLVAL xstrieql() { return (strcompare('=',TRUE)); } /* string-ci=? */
  2039. XLVAL xstrigeq() { return (strcompare('G',TRUE)); } /* string-ci>=? */
  2040. XLVAL xstrigtr() { return (strcompare('>',TRUE)); } /* string-ci>? */
  2041. X
  2042. X/* strcompare - compare strings */
  2043. XLOCAL LVAL strcompare(fcn,icase)
  2044. X  int fcn,icase;
  2045. X{
  2046. X    int start1,end1,start2,end2,ch1,ch2;
  2047. X    unsigned char *p1,*p2;
  2048. X    LVAL str1,str2;
  2049. X
  2050. X    /* get the strings */
  2051. X    str1 = xlgastring();
  2052. X    str2 = xlgastring();
  2053. X    xllastarg();
  2054. X
  2055. X    /* setup the string pointers */
  2056. X    p1 = getstring(str1); start1 = 0; end1 = getslength(str1);
  2057. X    p2 = getstring(str2); start2 = 0; end2 = getslength(str2);
  2058. X
  2059. X    /* compare the strings */
  2060. X    for (; start1 < end1 && start2 < end2; ++start1,++start2) {
  2061. X    ch1 = *p1++;
  2062. X    ch2 = *p2++;
  2063. X    if (icase) {
  2064. X        if (isupper(ch1)) ch1 = tolower(ch1);
  2065. X        if (isupper(ch2)) ch2 = tolower(ch2);
  2066. X    }
  2067. X    if (ch1 != ch2)
  2068. X        switch (fcn) {
  2069. X        case '<':    return (ch1 < ch2 ? true : NIL);
  2070. X        case 'L':    return (ch1 <= ch2 ? true : NIL);
  2071. X        case '=':    return (NIL);
  2072. X        case 'G':    return (ch1 >= ch2 ? true : NIL);
  2073. X        case '>':    return (ch1 > ch2 ? true : NIL);
  2074. X        }
  2075. X    }
  2076. X
  2077. X    /* check the termination condition */
  2078. X    switch (fcn) {
  2079. X    case '<':    return (start1 >= end1 && start2 < end2 ? true : NIL);
  2080. X    case 'L':    return (start1 >= end1 ? true : NIL);
  2081. X    case '=':    return (start1 >= end1 && start2 >= end2 ? true : NIL);
  2082. X    case 'G':    return (start2 >= end2 ? true : NIL);
  2083. X    case '>':    return (start2 >= end2 && start1 < end1 ? true : NIL);
  2084. X    }
  2085. X}
  2086. X
  2087. X/* xcharint - built-in function 'char->integer' */
  2088. XLVAL xcharint()
  2089. X{
  2090. X    LVAL arg;
  2091. X    arg = xlgachar();
  2092. X    xllastarg();
  2093. X    return (cvfixnum((FIXTYPE)getchcode(arg)));
  2094. X}
  2095. X
  2096. X/* xintchar - built-in function 'integer->char' */
  2097. XLVAL xintchar()
  2098. X{
  2099. X    LVAL arg;
  2100. X    arg = xlgafixnum();
  2101. X    xllastarg();
  2102. X    return (cvchar((int)getfixnum(arg)));
  2103. X}
  2104. X
  2105. X/* character comparision functions */
  2106. XLVAL xchrlss() { return (chrcompare('<',FALSE)); } /* char<? */
  2107. XLVAL xchrleq() { return (chrcompare('L',FALSE)); } /* char<=? */
  2108. XLVAL xchreql() { return (chrcompare('=',FALSE)); } /* char=? */
  2109. XLVAL xchrgeq() { return (chrcompare('G',FALSE)); } /* char>=? */
  2110. XLVAL xchrgtr() { return (chrcompare('>',FALSE)); } /* char>? */
  2111. X
  2112. X/* character comparision functions (case insensitive) */
  2113. XLVAL xchrilss() { return (chrcompare('<',TRUE)); } /* char-ci<? */
  2114. XLVAL xchrileq() { return (chrcompare('L',TRUE)); } /* char-ci<=? */
  2115. XLVAL xchrieql() { return (chrcompare('=',TRUE)); } /* char-ci=? */
  2116. XLVAL xchrigeq() { return (chrcompare('G',TRUE)); } /* char-ci>=? */
  2117. XLVAL xchrigtr() { return (chrcompare('>',TRUE)); } /* char-ci>? */
  2118. X
  2119. X/* chrcompare - compare characters */
  2120. XLOCAL LVAL chrcompare(fcn,icase)
  2121. X  int fcn,icase;
  2122. X{
  2123. X    int ch1,ch2;
  2124. X    LVAL arg;
  2125. X    
  2126. X    /* get the characters */
  2127. X    arg = xlgachar(); ch1 = getchcode(arg);
  2128. X    arg = xlgachar(); ch2 = getchcode(arg);
  2129. X    xllastarg();
  2130. X
  2131. X    /* convert to lowercase if case insensitive */
  2132. X    if (icase) {
  2133. X    if (isupper(ch1)) ch1 = tolower(ch1);
  2134. X    if (isupper(ch2)) ch2 = tolower(ch2);
  2135. X    }
  2136. X
  2137. X    /* compare the characters */
  2138. X    switch (fcn) {
  2139. X    case '<':    return (ch1 < ch2 ? true : NIL);
  2140. X    case 'L':    return (ch1 <= ch2 ? true : NIL);
  2141. X    case '=':    return (ch1 == ch2 ? true : NIL);
  2142. X    case 'G':    return (ch1 >= ch2 ? true : NIL);
  2143. X    case '>':    return (ch1 > ch2 ? true : NIL);
  2144. X    }
  2145. X}
  2146. X
  2147. X/* xcompile - built-in function 'compile' */
  2148. XLVAL xcompile()
  2149. X{
  2150. X    extern LVAL xlcompile();
  2151. X    LVAL env;
  2152. X
  2153. X    /* get the expression to compile and the environment */
  2154. X    xlval = xlgetarg();
  2155. X    env = (moreargs() ? xlgaenv() : NIL);
  2156. X    xllastarg();
  2157. X    
  2158. X    /* build the closure */
  2159. X    cpush(env);
  2160. X    xlval = xlcompile(xlval,env);
  2161. X    xlval = cvclosure(xlval,env);
  2162. X    drop(1);
  2163. X    return (xlval);
  2164. X}
  2165. X
  2166. X/* xdecompile - built-in function 'decompile' */
  2167. XLVAL xdecompile()
  2168. X{
  2169. X    LVAL fun,fptr;
  2170. X
  2171. X    /* get the closure (or code) and file pointer */
  2172. X    fun = xlgetarg();
  2173. X    fptr = (moreargs() ? xlgaoport() : curoutput());
  2174. X    xllastarg();
  2175. X
  2176. X    /* make sure we got either a closure or a code object */
  2177. X    if (!closurep(fun) && !methodp(fun))
  2178. X    xlbadtype(fun);
  2179. X
  2180. X    /* decompile (disassemble) the procedure */
  2181. X    decode_procedure(fptr,fun);
  2182. X    return (NIL);
  2183. X}
  2184. X
  2185. X/* xsave - save the memory image */
  2186. XLVAL xsave()
  2187. X{
  2188. X    unsigned char *name;
  2189. X
  2190. X    /* get the file name, verbose flag and print flag */
  2191. X    name = getstring(xlgastring());
  2192. X    xllastarg();
  2193. X
  2194. X    /* save the memory image */
  2195. X    return (xlisave(name) ? true : NIL);
  2196. X}
  2197. X
  2198. X/* xrestore - restore a saved memory image */
  2199. XLVAL xrestore()
  2200. X{
  2201. X    extern jmp_buf top_level;
  2202. X    unsigned char *name;
  2203. X
  2204. X    /* get the file name, verbose flag and print flag */
  2205. X    name = getstring(xlgastring());
  2206. X    xllastarg();
  2207. X
  2208. X    /* restore the saved memory image */
  2209. X    if (!xlirestore(name))
  2210. X    return (NIL);
  2211. X
  2212. X    /* return directly to the top level */
  2213. X    stdputstr("[ returning to the top level ]\n");
  2214. X    longjmp(top_level,1);
  2215. X}
  2216. X
  2217. X/* xgc - function to force garbage collection */
  2218. XLVAL xgc()
  2219. X{
  2220. X    extern FIXTYPE nnodes,nfree,gccalls,total;
  2221. X    extern int nscount,vscount;
  2222. X    int arg1,arg2;
  2223. X    LVAL arg;
  2224. X    
  2225. X    /* check the argument list and call the garbage collector */
  2226. X    if (moreargs()) {
  2227. X    arg = xlgafixnum(); arg1 = (int)getfixnum(arg);
  2228. X    arg = xlgafixnum(); arg2 = (int)getfixnum(arg);
  2229. X    xllastarg();
  2230. X    nexpand(arg1);
  2231. X    vexpand(arg2);
  2232. X    }
  2233. X    else
  2234. X    gc();
  2235. X
  2236. X    /* return (gccalls nnodes nfree nscount vscount total) */
  2237. X    xlval = cons(cvfixnum(total),NIL);
  2238. X    xlval = cons(cvfixnum((FIXTYPE)vscount),xlval);
  2239. X    xlval = cons(cvfixnum((FIXTYPE)nscount),xlval);
  2240. X    xlval = cons(cvfixnum(nfree),xlval);
  2241. X    xlval = cons(cvfixnum(nnodes),xlval);
  2242. X    xlval = cons(cvfixnum(gccalls),xlval);
  2243. X    return (xlval);
  2244. X}
  2245. X
  2246. X/* xerror - built-in function 'error' */
  2247. XLVAL xerror()
  2248. X{
  2249. X    extern jmp_buf top_level;
  2250. X    LVAL msg;
  2251. X
  2252. X    /* display the error message */
  2253. X    msg = xlgastring();
  2254. X    errputstr("error: ");
  2255. X    errputstr(getstring(msg));
  2256. X    errputstr("\n");
  2257. X    
  2258. X    /* print each of the remaining arguments on separate lines */
  2259. X    while (moreargs()) {
  2260. X    errputstr("  ");
  2261. X    errprint(xlgetarg());
  2262. X    }
  2263. X    
  2264. X    /* print the function where the error occurred */
  2265. X    errputstr("happened in: ");
  2266. X    errprint(xlfun);
  2267. X
  2268. X    /* call the handler */
  2269. X    callerrorhandler();
  2270. X}
  2271. X
  2272. X/* xreset - built-in function 'reset' */
  2273. XLVAL xreset()
  2274. X{
  2275. X    extern jmp_buf top_level;
  2276. X    xllastarg();
  2277. X    longjmp(top_level,1);
  2278. X}
  2279. X
  2280. X/* xgetarg - return a command line argument */
  2281. XLVAL xgetarg()
  2282. X{
  2283. X    extern char **clargv;
  2284. X    extern int clargc;
  2285. X    LVAL arg;
  2286. X    int n;
  2287. X    arg = xlgafixnum(); n = (int)getfixnum(arg);
  2288. X    xllastarg();
  2289. X    return (n >= 0 && n < clargc ? cvstring(clargv[n]) : NIL);
  2290. X}
  2291. X
  2292. X/* xexit - exit to the operating system */
  2293. XLVAL xexit()
  2294. X{
  2295. X    xllastarg();
  2296. X    wrapup();
  2297. X}
  2298. END_OF_FILE
  2299. if test 27271 -ne `wc -c <'Src/xsfun2.c'`; then
  2300.     echo shar: \"'Src/xsfun2.c'\" unpacked with wrong size!
  2301. fi
  2302. # end of 'Src/xsfun2.c'
  2303. fi
  2304. echo shar: End of archive 4 \(of 7\).
  2305. cp /dev/null ark4isdone
  2306. MISSING=""
  2307. for I in 1 2 3 4 5 6 7 ; do
  2308.     if test ! -f ark${I}isdone ; then
  2309.     MISSING="${MISSING} ${I}"
  2310.     fi
  2311. done
  2312. if test "${MISSING}" = "" ; then
  2313.     echo You have unpacked all 7 archives.
  2314.     rm -f ark[1-9]isdone
  2315. else
  2316.     echo You still need to unpack the following archives:
  2317.     echo "        " ${MISSING}
  2318. fi
  2319. ##  End of shell archive.
  2320. exit 0
  2321. -- 
  2322. Mail submissions (sources or binaries) to <amiga@cs.odu.edu>.
  2323. Mail comments to the moderator at <amiga-request@cs.odu.edu>.
  2324. Post requests for sources, and general discussion to comp.sys.amiga.
  2325.